//
//  CoreDataManager.h
//  InterventixApp
//
//  Created by Diego Falcinelli on 23/06/13.
//
//

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "ClienteCD.h"
#import "InterventoCD.h"
#import "DettaglioCD.h"
#import "UtenteCD.h"
#import "Intervento.h"

@interface CoreDataManager : NSObject {
    
@private
    NSManagedObjectContext *managedObjectContext_;
    NSManagedObjectModel *managedObjectModel_;
    NSPersistentStoreCoordinator *persistentStoreCoordinator_;
}
//Metodi e proprietà del contesto
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
-(NSString *)applicationDocumentsDirectory;





//Coda delle Operazioni
@property (nonatomic, retain) NSOperationQueue *operationQueue;

//Proprietà clienti
@property (nonatomic,retain) NSArray *clienti_mod, *clienti_del_id;

//Proprietà utenti
@property (nonatomic,retain) NSArray *utenti_mod, *utenti_del_id;

//Proprietà Interventi
@property (nonatomic,retain) NSArray *interventi_mod, *interventi_del_id, *interventi_status_id;

//ID dell'utente loggato per distinguere i database
@property (nonatomic,retain) NSNumber *id_user_logged;


@property (atomic) BOOL inuse_interventi, inuse_clienti,inuse_utenti;



// Costruttori
- (id)initWhidUserLogged:(UtenteCD *)userLogged;
- (id)initWhidIdUserLogged:(NSNumber *)idUserLogged;

//Metodi clienti
-(void) syncroClienti:(NSArray *) clienti_MOD del: (NSArray *) clienti_DEL;
-(void) syncroClientiMT;
-(ClienteCD *)findCliente:(NSNumber *) idcliente;
-(void) addCliente:(NSDictionary *)clienteDiz;
-(void) modCliente:(NSDictionary *)clienteDiz;
-(void) delCliente:(NSNumber *) idcliente;
-(void) delClienteObject:(ClienteCD *) cliente;
-(NSArray *) getClienti;
-(NSArray *) likeClienti:(NSString *)like;
+(unsigned long long) hashcodeCliente:(ClienteCD *) i;
-(BOOL) checkCliente:(ClienteCD*)cliente;
-(NSString *) calcStatusCliente:(ClienteCD *) client;


//Metodi Utenti
-(void) syncroUtenti:(NSArray *) utenti_MOD del: (NSArray *) utenti_DEL;
-(void) syncroUtentiMT;
-(UtenteCD *)findUtente:(NSNumber *) idutente;
-(void) addUtente:(NSDictionary *)utenteDiz;
-(void) modUtente:(NSDictionary *)utenteDiz;
-(void) delUtente:(NSNumber *)idutente;
-(NSArray *) getUtenti:(NSString *) tipo;
+(unsigned long long) hashcodeUtente:(UtenteCD *) i;
-(NSArray *) getUtentiAll;

//Metodi Interventi
-(void) syncroInterventi:(NSArray *) interventi_mod del:(NSArray *) interventi_del_id  status:(NSArray*) interventi_status_id;
-(void) syncroInterventiMT;
-(InterventoCD *)findIntervento:(NSNumber *) idintervento;
-(void) addIntervento:(NSDictionary *)interDiz withBuffer:(BOOL) buffer;
-(void) modIntervento:(NSDictionary *)interDiz withBuffer:(BOOL) buffer;
-(void) delIntervento:(NSNumber *)idintervento;
-(NSArray *) getInterventi;
-(NSArray *) getInterventiToSend;
+(unsigned long long) hashcodeIntervento:(InterventoCD *) i;
-(BOOL) checkIntervento:(InterventoCD *)cliente;
-(NSString *) calcStatusIntervento:(InterventoCD *)inter;


//Metodi Dettagli
-(DettaglioCD *)findDettaglio:(NSNumber *) iddettaglio;
-(void) addDettaglio:(NSDictionary *)dettaglioDiz;
-(void) modDettaglio:(NSDictionary *)dettaglioDiz;
-(void) delDettaglio:(NSNumber *)iddettaglio;
+(unsigned long long) hashcodeDettaglio:(DettaglioCD *) i;
-(void) saveDettaglio:(DettaglioCD*)dettaglio;
-(BOOL) checkDettaglio:(DettaglioCD*)dettaglio;



//Metodi Opzioni
-(NSNumber *)getRevisionClienti;
-(void)setRevisionClienti:(NSNumber *) rev;
-(NSNumber *)getRevisionUtenti;
-(void)setRevisionUtenti:(NSNumber *) rev;
-(NSNumber *)getRevisionInterventi;
-(void)setRevisionInterventi:(NSNumber *) rev;

-(NSNumber *)getMinDettagli;

//Salvataggio del contesto
-(void) save;
-(void) dropDatabase;

//Refresh dell'oggetto dal database
-(void) refresh:(NSManagedObject*) obj;

//Salvataggio del contesto
-(void) deleteObject:(NSManagedObject *) obj;

@end